// 调用 Generator 函数后，该函数并不执行，返回的也不是函数运行结果，而是一个指向内部状态的指针对象，也就是上一章介绍的遍历器对象（Iterator Object）
// 下一步，必须调用遍历器对象的next方法，使得指针移向下一个状态。也就是说，每次调用next方法，内部指针就从函数头部或上一次停下来的地方开始执行，直到遇到下一个yield表达式（或return语句）为止。换言之，Generator 函数是分段执行的，yield表达式是暂停执行的标记，而next方法可以恢复执行。
// 由于next方法的参数表示上一个yield表达式的返回值，所以在第一次使用next方法时，传递参数是无效的。
function log(s) {
    console.log(s)
}

// function* helloWorldGenerator() {
//     yield 'hello';
//     yield 'world';
//     return 'ending';
//   }

// var hw = helloWorldGenerator();
// log(hw.next());
// log(hw.next());
// log(hw.next());
// log(hw.next());

// function* f(){
//     console.log('执行了');
// }
// var generator=f();
// setTimeout(()=>generator.next(),2000)
// var arr = [1, [[2, 3], 4], [5, 6]];
// var flat=function* (a){
//     var length=a.length;
//     for(var i=0;i<length;i++){
//         var item=a[i];
//         if(typeof item !=='number'){
//             yield* flat(item)
//         }else{
//             yield item;            
//         }
//     }
// }
// for(var f of flat(arr)){
//     console.log(f)
// }
// function* dataConsumer() {
//     console.log('Started');
//     console.log(`1. ${yield}`);
//     console.log(`2. ${yield}`);
//     return 'result';
//   }

//   let genObj = dataConsumer();
//   genObj.next();
//   // Started
//   genObj.next('a')
//   // 1. a
//   genObj.next('b')
//   genObj.next();

// function* fibonacci(){
//     let [prv,curr]=[0,1];
//     for(;;){
//         yield curr;
//         [prv,curr]=[curr,prv+curr];
//     }
// }

// for (let n of fibonacci()){
//     if(n>10000)break;
//     console.log(n);
// }
// function* objectEntries(obj){
//     let propKeys=Reflect.ownKeys(obj);
//     for(let prop of propKeys){
//         yield [prop,obj[prop]];
//     }
// }

// var obj = { first: 'Jane', last: 'Doe' };
// // for(let [key,value] of objectEntries(obj)){
// //     console.log(`${key}:${value}`)
// // }
// function* objectEntries() {
//     var propKeys = Object.keys(this);
//     for (let propKey of propKeys) {
//         yield [propKey, this[propKey]];
//     }
// }
// obj[Symbol.iterator]=objectEntries
// for (let [key, value] of obj) {
//     console.log(`${key}: ${value}`);
// }
function* inner() {
    yield 'hello!';
}

function* outer1() {
    yield 'open';
    yield* inner();
    yield 'close';
}

var gen = outer1()
log(gen.next().value) // "open"
log(gen.next().value) // 返回一个遍历器对象
log(gen.next().value) // "close"
